/*
Copyright © 2025 NAME HERE <EMAIL ADDRESS>
*/
package config

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"github.com/spf13/viper"
)

// Config 存储所有配置信息
type Config struct {
	// AI 配置
	AI AIConfig `mapstructure:"ai"`
}

// AIConfig AI服务配置
type AIConfig struct {
	// BaseURL AI服务基础URL
	BaseURL string `mapstructure:"base_url"`
	// APIKey AI服务API密钥
	APIKey string `mapstructure:"api_key"`
	// Model 使用的AI模型名称
	Model string `mapstructure:"model"`
}



// 默认配置值
var defaultConfig = Config{
	AI: AIConfig{
		BaseURL: "https://api.deepseek.com",
		Model:   "deepseek-chat",
	},
}

// GetDefaultConfigPath 获取默认配置文件路径
// 返回用户家目录下的 .fanyi/fanyi.yaml 路径
func GetDefaultConfigPath() (string, error) {
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return "", fmt.Errorf("获取用户家目录失败: %w", err)
	}
	return filepath.Join(homeDir, ".fanyi", "fanyi.yaml"), nil
}

// CreateDefaultConfig 在指定路径创建默认配置文件
func CreateDefaultConfig(configPath string) error {
	// 确保目录存在
	configDir := filepath.Dir(configPath)
	if err := os.MkdirAll(configDir, 0755); err != nil {
		return fmt.Errorf("创建配置目录失败: %w", err)
	}

	// 默认配置内容
	defaultConfigContent := `# fanyi 配置文件
# 此文件由程序自动生成，请根据需要修改

# AI 服务配置
ai:
  # AI 服务基础 URL，默认为 https://api.deepseek.com
  base_url: https://api.deepseek.com
  # AI 服务 API 密钥，必须设置
  # 也可以通过环境变量 FANYI_AI_API_KEY 设置
  api_key: "your-api-key-here"
  # 使用的 AI 模型名称，默认为 deepseek-chat
  model: "deepseek-chat"
`

	// 写入配置文件
	if err := os.WriteFile(configPath, []byte(defaultConfigContent), 0644); err != nil {
		return fmt.Errorf("创建配置文件失败: %w", err)
	}

	return nil
}

// LoadConfig 加载配置
// configFile 可选的配置文件路径，如果为空则使用默认路径
func LoadConfig(configFile string) (*Config, error) {
	v := viper.New()

	// 设置配置文件类型
	v.SetConfigType("yaml")

	var actualConfigFile string
	// 如果指定了配置文件，则使用指定的配置文件
	if configFile != "" {
		actualConfigFile = configFile
	} else {
		// 使用默认配置文件路径
		defaultPath, err := GetDefaultConfigPath()
		if err != nil {
			return nil, err
		}
		actualConfigFile = defaultPath
	}

	// 检查配置文件是否存在
	if _, err := os.Stat(actualConfigFile); os.IsNotExist(err) {
		return nil, fmt.Errorf("配置文件不存在: %s\n请运行程序初始化配置文件或手动创建配置文件", actualConfigFile)
	}

	// 设置配置文件路径
	v.SetConfigFile(actualConfigFile)

	// 设置环境变量前缀
	v.SetEnvPrefix("FANYI")
	// 使用环境变量替换配置
	v.AutomaticEnv()
	// 将点分隔的配置项映射到环境变量中的下划线
	v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

	// 读取配置文件
	if err := v.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	// 创建配置对象并设置默认值
	config := defaultConfig

	// 将配置文件中的值解析到结构体中
	if err := v.Unmarshal(&config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %w", err)
	}

	return &config, nil
}
